<?php
// +----------------------------------------------------------------------
// | sfadmin - Suifeng Administration
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://suifeng.tech All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: suifeng <1787585212@qq.com>
// +----------------------------------------------------------------------

namespace suifeng\helper;

class ClassHelper
{
    /**
     * 将字符串转换成类名。
     *
     * @param unknown $str
     * @return string
     */
    public static function format_class_name($str)
    {
        return implode('', array_map('ucfirst', explode('_', $str)));
    }

    /**
     * 获取类的简短名称。
     *
     * @param unknown $class
     * @return string
     */
    public static function short_name($class)
    {
        $rc = new \ReflectionClass($class);
        return $rc->getShortName();
    }

    /**
     * 检查对象属性是否存在。
     *
     * @param unknown $object
     * @param unknown $name
     * @return boolean
     */
    public static function property_exists($object, $name)
    {
        $ref_class = new \ReflectionClass($object);
        return $ref_class->hasProperty($name);
    }

    /**
     * 获取对象属性值。
     *
     * @param unknown $object
     * @param unknown $name
     * @param array $args
     * @return NULL|mixed
     */
    public static function get_property($object, $name)
    {
        $ref_class = new \ReflectionClass($object);
        if (! $ref_class->hasProperty($name)) {
            return null;
        }

        $ref_property = $ref_class->getProperty($name);
        $ref_property->setAccessible(true);
        return $ref_property->getValue($object);
    }

    /**
     * 检查对象方法是否存在。
     *
     * @param unknown $object
     * @param unknown $name
     * @return boolean
     */
    public static function method_exists($object, $name)
    {
        $ref_class = new \ReflectionClass($object);
        return $ref_class->hasMethod($name);
    }

    /**
     * 调用对象方法。
     *
     * @param unknown $object
     * @param unknown $name
     * @param array $args
     * @return NULL|mixed
     */
    public static function invoke_method($object, $name, $args = [])
    {
        $ref_class = new \ReflectionClass($object);
        if (! $ref_class->hasMethod($name)) {
            return null;
        }

        $ref_method = $ref_class->getMethod($name);
        $ref_method->setAccessible(true);
        return $ref_method->invokeArgs($object, $args);
    }

    public static function invoke_callback($callback, $args = [])
    {
        if (is_callable($callback)) {
            return call_user_func_array($callback, $args);
        }
        return self::invoke_method($callback[0], $callback[1], $args);
    }

    /**
     * 将字符串转换成特定类型。
     *
     * @param unknown $str
     * @param unknown $type
     * @return NULL
     */
    public static function convert_type($str, $type)
    {
        if (strlen($str) == 0 || strtolower($str) == '_null_') {
            return null;
        }

        $type = strtolower($type);

        switch ($type) {
            case 'int':
            case 'integer':
            case 'short':
            case 'long':
            case 'byte':
                return intval($str);

            case 'date':
            case 'datetime':
                return intval($str);

            case 'float':
            case 'double':
            case 'decimal':
            case 'money':
            case 'byte':
                return floatval($str);

            case 'bool':
            case 'boolean':
                if (in_array(strtolower($str), ['1', 'true', 'on', 'open', 'yes', 'enable'])) {
                    return true;
                } else if (in_array(strtolower($str), ['0', 'false', 'off', 'close', 'no', 'disable'])) {
                    return false;
                } else {
                    return boolval($str);
                }
                break;

            case 'string':
            case 'str':
                return strval($str);

            default:
                return $str;
        }
    }

    /**
     * 获取类型的默认值。
     *
     * @param unknown $type
     * @return NULL
     */
    public static function default_value($type)
    {
        switch (strtolower($type)) {
            case 'int':
            case 'integer':
            case 'short':
            case 'long':
            case 'byte':
            case 'float':
            case 'double':
            case 'decimal':
            case 'money':
            case 'byte':
                return 0;

            case 'bool':
            case 'boolean':
                return false;

            case 'string':
            case 'str':
                return '';

            default:
                return null;
        }
    }
}
